package main

import "fmt"

func showAddr(x [5]int) [5]int { // x形式参数
	fmt.Printf("x %T, %[1]v, %p %p %p\n", x, &x, &x[0], &x[1])
	x[0] = 1000
	fmt.Printf("x %T, %[1]v, %p %p %p\n", x, &x, &x[0], &x[1])
	return x
}
func main() {
	// var a1 [3]int                                               // 声明一个长度为3的数组 a1标识符	零值帮我们定义了个顺序表，每一个元素是 int 8Bytes，共 24B
	// fmt.Printf("%T %[1]v, %p %p %p\n", a1, &a1, &a1[0], &a1[1]) // [0 0 0]
	// var a2 = [5]int{}
	// fmt.Printf("%T %[1]v\n", a2, a2) // [1 2 3]
	// const count = 3
	// var a3 = [count]int{}
	// fmt.Println(a3)
	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ")

	// var a4 [3]int = [3]int{} // []int是类型，{}表示字面量开始，里面写元素
	// fmt.Println(a4)

	// var a5 = [3]int{}
	// fmt.Println(a5)

	// var a6 = [3]int{1}
	// fmt.Println(a6) // [1 0 0]

	// var a7 = [3]int{1, 2, 3}
	// fmt.Println(a7, len(a7), cap(a7)) // [1 2 3] // 数组一旦创建，占内存大小确定不? yes
	// // go的数组增删效率高吗？不能增删

	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ")
	// var a8 = [5]int{1: 20, 4: 50, 3: -1}
	// fmt.Println(a8) // [0 20 -1 50 0] // 数组的元素可以不连续赋值，未赋值的元素为零值

	// for i := 0; i < len(a8); i++ {
	// 	fmt.Println(i, a8[i])
	// }

	// var a9 = [...]int{1, 2, 3, 4}
	// a9[0] = 100 // 数组的元素可以修改
	// fmt.Println(a9)

	// var a10 = [2][3]int{{100}, {1: 1000}} // 二维数组，第一行第一个元素为100，第二行第二个元素为1000
	// fmt.Println(a10[0])                   // [100 0 0]
	// fmt.Println(a10[1][1])                // 0

	// var a11 = [2][3]int{{1, 2}, {4, 5, 6}} // 二维数组
	// fmt.Println(a11, len(a11), cap(a11))   // [[1 2 0] [4 5 6]] 2 2
	// for i := 0; i < len(a11); i++ {
	// 	for j := 0; j < len(a11[i]); j++ {
	// 		fmt.Printf("a11[%d][%d] = %d\n", i, j, a11[i][j])
	// 	}
	// }

	// var b = [5]int{0, 20, 0, -1, 50} // 数组的长度必须在声明时确定，不能使用变量
	// fmt.Println(b, &b)
	// fmt.Printf("%p\n", &b)
	// for i := 0; i < len(b); i++ {
	// 	fmt.Println(i, b[i], &b[i])
	// }

	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ")

	// var c = [5]string{"abc", "dfkljliwejroiiqwpoekrlmlkgj"}
	// fmt.Println(c, &c) // [   ]
	// fmt.Printf("%p\n", &c)
	// for i := 0; i < len(c); i++ {
	// 	fmt.Println(i, c[i], &c[i])
	// }

	var d1 = [5]int{0, 20, 0, -1, 50}
	fmt.Printf("d1 %T, %[1]v, %p %p %p\n", d1, &d1, &d1[0], &d1[1])

	var d2 = d1 // copy 完全一样内存结构的副本 拷贝
	fmt.Println(d2 == d1, &d1 == &d2)
	fmt.Printf("d2 %T, %[1]v, %p %p %p\n", d2, &d2, &d2[0], &d2[1])

	d3 := showAddr(d1)
	fmt.Printf("d1 %T, %[1]v, %p %p %p\n", d1, &d1, &d1[0], &d1[1])
	fmt.Printf("d2 %T, %[1]v, %p %p %p\n", d2, &d2, &d2[0], &d2[1])
	fmt.Printf("d3 %T, %[1]v, %p %p %p\n", d3, &d3, &d3[0], &d3[1])

}
